home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
401_500
/
DISK0417
/
DISK0417.ZIP
/
PROLOG.ARC
/
SAMPLES.ARC
/
DIF.PRO
< prev
next >
Wrap
Text File
|
1986-07-20
|
1KB
|
53 lines
/*
This program performs symbolic differentiation.
Sample forms to differentiate:
?-d(x+1,x,X).
?-d(x*x-2,x,X).
?-dif( 3*x, x, F ), simp( F, E ).
?-dif( 3*x+4, x, F ), simp( F, E ).
"simp" simplifies by providing alternate forms for an expression.
See C & M for more on this.
*/
?-op( 9, fx, '%' ).
/* For types PD and ED only: */
?-op( 9, xfx, '**' ).
d(X,X,1) :- !.
d(C,X,0) :- atomic(C).
d(%U, X, %A) :- d( U, X, A ).
d( U+V, X, A+B) :- d(U,X,A), d(V,X,B).
d( U-V, X, A-B ) :- d(U,X,A), d(V,X,B).
d(C*U,X,C*A) :- atomic(C), C \= X, d(U,X,A), !.
d(U*V,X,B*U+A*V) :- d(U,X,A), d(V,X,B).
d(U/V,X,A) :- d(U*V**(%1),X,A).
d(U**V,X,V*W*U**(V-1)) :- alpha, atomic(V), c \= X, d(U,X,W).
d(log(U),X,A*U**(%1)) :- d(U,X,A).
simp(E,E) :- atomic(E), !.
simp(E,F) :-
E =.. [Op, La, Ra],
simp( La, X ),
simp( Ra, Y ),
s( Op, X, Y, F ).
s( +, X, 0, X ).
s( +, 0, X, X ).
s( +, X, Y, X + Y ).
s( *, _, 0, 0 ).
s( *, 0, _, 0 ).
s( *, 1, X, X ).
s( *, X, 1, X ).
s(*, X, Y, X * Y ).
s( +, X, Y, Z ) :- integer(X), integer(Y), Z is X + Y.
s( *, X*Y,W, X*Z) :- integer(Y), integer(W), Z is Y*W.